package main

import "fmt"

func main() {
	person := &Person{"TigerwolfC", 25}
	fmt.Printf("person<%s:%d>\n", person.name, person.age)
	person.sayHi()
	person.ModifyAge(28)
	person.sayHi()
}

type Person struct {
	name string
	age  int
}

func (p *Person) sayHi() {
	fmt.Printf("SayHi -- This is %s, my age is %d\n", p.name, p.age)
}
func (p *Person) ModifyAge(age int) {
	fmt.Println("ModifyAge")
	p.age = age
}

//接受者是类型的实例变量：尽管 ModifyAge 方法修改了其age字段，可是方法里的p是person变量的一个副本，修改的只是副本的值。下一次调用sayHi方法的时候，还是person的副本，因此修改方法并不会生效。即实例变量的方式并不会改变接受者本身的值。
//接受者是类型的指针变量：如果实例对象是值，那么go会转换成指针，然后再拷贝，如果本身就是指针对象，那么就直接拷贝指针实例。因为指针都指向一处值，就能修改对象了。
